﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using DA_OOMModel;
using DaCredito.Controles;
using System.Reflection;
using NHibernate.Mapping;
using NHibernate.Cfg;

namespace DaCredito
{
    public partial class WebPage : System.Web.UI.Page
    {

        protected Modulo ioModulo;

        protected bool abExigeUsuarioLogado = true;

        protected virtual void PrePageLoad()
        {

     
            

        }
        /*
        protected void Page_Load(object sender, EventArgs e)
        {
        }*/
        protected override void OnLoad(EventArgs e)
        {
           
            this.PrePageLoad();

            if (abExigeUsuarioLogado)
            {
                Usuario loUsuario = (Usuario) Session["Usuario"];
                if (loUsuario == null)
                {
                    //throw new Exception("É necessário efetuar login para acessar esta página");
                }
            }

            this.PosPageLoad();

            if (!this.IsPostBack)
            {
                this.IniciaValores();
            }

        }
        protected void PosPageLoad()
        {


        }

        protected void Page_Error(object sender, EventArgs e)
        {
            Exception loException = Server.GetLastError();

            this.DisparaMensagem(loException);

        }
        protected virtual bool OnSave()
        {

            bool lbRetornoAtualizacao = false;

            try
            {
                lbRetornoAtualizacao = this.OnUpdate();
            }
            catch (Exception exception)
            {
                this.DisparaMensagem(exception);
                return false;
            }

            if (lbRetornoAtualizacao == true)
            {
                this.DisparaMensagem("Dados salvos com sucesso!", TipoOperacao.Success);
            }

            return true;

        }
        protected virtual void IniciaValores()
        {




        }
        protected virtual bool OnUpdate()
        {
            return true;
        }

        protected void DisparaMensagem(Exception aoException)
        {
            string lsMensagem = "";
            Exception loExceptionAuxiliar = aoException;

            lsMensagem = loExceptionAuxiliar.Message;
            while (loExceptionAuxiliar.InnerException != null)
            {
                loExceptionAuxiliar = loExceptionAuxiliar.InnerException;
                lsMensagem += loExceptionAuxiliar.Message;
            }

            this.DisparaMensagem(lsMensagem, TipoOperacao.Failure);
        }

        protected void DisparaMensagem(string asMensagem, TipoOperacao aoTipoOperacao)
        {
            MessagePanel loControl = (MessagePanel)this.EncontrarControle(this.Form.Controls, "pnMessagePanel");

            if (loControl != null)
            {

                if (aoTipoOperacao == TipoOperacao.Success)
                {
                    loControl.AddMessageSucess(asMensagem);
                    loControl.ShowSuccess();
                }
                else
                {
                    loControl.AddMessageError(asMensagem);
                    loControl.ShowErrors();
                }
            }

           
        }

        protected string GetNomeColuna(PersistentClass aoClassMapping, string asNomePropriedade)
        {

            if (asNomePropriedade == aoClassMapping.IdentifierProperty.Name)
            {
                foreach (Column loColumn in aoClassMapping.IdentifierProperty.ColumnIterator)
                {
                    return loColumn.Name;
                }

            }

            foreach (Property loProperty in aoClassMapping.SubclassPropertyClosureIterator)
            {
                if (asNomePropriedade == loProperty.Name)
                {
                    foreach (Column loColumn in loProperty.ColumnIterator)
                    {
                        return loColumn.Name;
                    }
                }
            }

            return "";
        }
        protected string GetValorChavePrimaria(object aoInstanciaEntidade)
        {

            Configuration cfg = new Configuration();
            cfg.Configure(Assembly.Load("DA_OOMNHibernateDAL"), "DA_OOMNHibernateDAL.hibernate.cfg.xml");

            PersistentClass loPersistentClass = cfg.GetClassMapping(aoInstanciaEntidade.GetType());

            PropertyInfo loPropertyInfo = aoInstanciaEntidade.GetType().GetProperty(loPersistentClass.IdentifierProperty.Name);

            object loValue = loPropertyInfo.GetValue(aoInstanciaEntidade, null);

            if (loValue != null)
                return loValue.ToString();

            return "";
        }
        protected List<string> GetListaNomesColunas(PersistentClass aoClassMapping)
        {

            List<string> loListanomesColunas = new List<string>();

            foreach (Column loColumn in aoClassMapping.Key.ColumnIterator)
            {
                loListanomesColunas.Add(loColumn.Name);
            }


            foreach (Property loProperty in aoClassMapping.SubclassPropertyClosureIterator)
            {
                foreach (Column loColumn in loProperty.ColumnIterator)
                {
                    loListanomesColunas.Add(loColumn.Name);
                }

            }


            return loListanomesColunas;
        }
        protected Control EncontrarControle(ControlCollection aoListaControles, string asIdControle)
        {
            foreach (Control loControl in aoListaControles)
            {

                if (loControl.ID == asIdControle)
                {
                    return loControl;
                }
                else
                {
                    Control loControlAuxiliar = this.EncontrarControle(loControl.Controls, asIdControle);
                    if (loControlAuxiliar != null)
                        return loControlAuxiliar;
                }
            }

            return null;

        }

        public Control EncontrarControle(string asIdControle)
        {
            return this.EncontrarControle(this.Controls, asIdControle);

        }
        protected void CarregaEntidadePagina(Type aoTipoEntidade, object aoInstanciaEntidade)
        {
            PropertyInfo[] loListaPropertyInfo = aoTipoEntidade.GetProperties();

            foreach (PropertyInfo loPropertyInfo in loListaPropertyInfo)
            {

                Control loControl = null;
                // Se é um tipo primitivo, procura pelo nome do atributo
                if ((loPropertyInfo.PropertyType).IsPrimitive)
                {
                    loControl = this.EncontrarControle("Column_" + loPropertyInfo.Name);
                }
                // Senão, procuperma pelo nome especifico
                else
                {
                    loControl = this.EncontrarControle("Column_" + loPropertyInfo.Name);
                }

                if (null != loControl)
                {

                    if (loControl.GetType().Name == "HiddenField")
                    {
                        ((HiddenField)loControl).Value = loPropertyInfo.GetValue(aoInstanciaEntidade, null).ToString();
                    }
                    else
                    {
                        object loValue = loPropertyInfo.GetValue(aoInstanciaEntidade, null);

                        if (loValue != null)
                        {
                            if ((loValue.GetType().Name == "String") ||
                                (loValue.GetType().Name == "Decimal") ||
                                (loValue.GetType().Name == "DateTime"))
                            {
                                
                                if (loControl.GetType().BaseType.BaseType.Name == "ControlePersonalizado")
                                {
                                  ((ControlePersonalizado)loControl).value = loValue.ToString();
                                }
                              
                                else
                                {
                                    ((WebControl)loControl).Attributes["value"] = loValue.ToString();
                                }
                            }
                            else
                            {/*
                                if (loControl.GetType() == typeof(DropDownList))
                                    ((DropDownList)loControl).SelectedValue = this.GetValorChavePrimaria(loValue);
                                else
                                    ((WebControl)loControl).Attributes["value"] = this.GetValorChavePrimaria(loValue);
                           */
                            }
                        }
                    }

                }

            }
        }

    }
}
